题意:给定两个正整数$a$和$b$,求在$[a,b]$中的所有整数中,每个数字各出现了多少次。
定义状态$f[i][j][k]$表示以$j$开头的$i$位数$k$出现的次数
状态转移方程
$f[i][j][k]=\sum\limits_{p=0}^{9}f[i-1][p][k]+(10^{i-1}* [j==k])$
(解释:$i$位数除去最高位就是$i-1$位数,所以要加上所以$i-1$位数的出现次数$(\sum\limits_{p=0}^{9}f[i-1][p][k])$,再加上最高位出现的次数$(10^{i-1}* [j==k])$
求$A$到$B$之间出现的次数即使就$(1$~$B)-(1$~$(A-1))$的次数
$dp$完了后要开始统计了,首先特判$0$的情况,然后计算出这个数的位数$pos$,所以位数比这个数小的都可以统计答案。由于不能有前导$0$,所以最高位要从$1$枚举到$9$,再枚举所有$i$位数,从最高位枚举到最低位,只要小于当前位的都可以统计(注意等于不可以统计),再统计一下当前位的贡献,最后还要减去前导$0$的情况
1 |
|